package com.roger.tool.utils;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
/**
 * 文件帮助类
 * @author lch
 *
 */
public class FileUtils2 {

	/**
	 * 功能：Java读取txt文件的内容 步骤：1：先获得文件句柄 2：获得文件句柄当做是输入一个字节码流，需要对这个输入流进行读取
	 * 3：读取到输入流后，需要读取生成字节流 4：一行一行的输出。readline()。 备注：需要考虑的是异常情况
	 * 
	 * @param filePath
	 */
	public static String readTxtFile(String pFilePath) {
		StringBuffer contentBuffer = new StringBuffer();
		try {
			File file = new File(pFilePath);
			if (file.isFile() && file.exists()) { // 判断文件是否存在
				InputStreamReader read = new InputStreamReader(new FileInputStream(file), "UTF-8");// 考虑到编码格式
				BufferedReader bufferedReader = new BufferedReader(read);
				String lineTxt = null;
				while ((lineTxt = bufferedReader.readLine()) != null) {
					contentBuffer.append(lineTxt);
					contentBuffer.append("\n");
				}
				read.close();
			} else {
				System.out.println("找不到指定的文件");
			}
		} catch (Exception e) {
			System.out.println("读取文件内容出错");
			e.printStackTrace();
		}
		return contentBuffer.toString();
	}

	public static String readFileToString(String pFilePath) {

		String s = "";
		try {
			File file = new File(pFilePath);
			if (file.isFile() && file.exists()) { // 判断文件是否存在

				FileInputStream inStream = new FileInputStream(pFilePath);
				ByteArrayOutputStream bos = new ByteArrayOutputStream();
				byte[] buffer = new byte[1024];
				int length = -1;
				while ((length = inStream.read(buffer)) != -1) {
					bos.write(buffer, 0, length);
				}
				bos.close();
				inStream.close();
				s = new String(bos.toByteArray(), "UTF-8");

			} else {
				System.out.println("找不到指定的文件");
			}
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("读取文件内容出错");
		}
		return s;
	}

	public static String inputStreamToStr(InputStream inputStream) {

		String s = "";
		try {
			ByteArrayOutputStream outStream = new ByteArrayOutputStream();
			byte[] data = new byte[2048];
			int count = -1;
			while ((count = inputStream.read(data, 0, 2048)) != -1) {
				outStream.write(data, 0, count);
			}
			data = null;
			s = new String(outStream.toByteArray(), "UTF-8");

		} catch (Exception e) {
			e.printStackTrace();
		}
		return s;
	}

	public static String inputStreamToString(InputStream inputStream) {

		String s = "";
		try {
			byte[] buffer = new byte[2048];
			int readBytes = 0;
			StringBuilder stringBuilder = new StringBuilder();
			while ((readBytes = inputStream.read(buffer)) > 0) {
				stringBuilder.append(new String(buffer, 0, readBytes));
			}
			s = stringBuilder.toString();

		} catch (Exception e) {
			e.printStackTrace();
		}
		return s;
	}

	public static void wiriteTxtFile(String pFilePath, String pContent) {
		try {
			File file = new File(pFilePath);
			if (!file.exists()) {
				file.createNewFile();
			}
			if (file.isFile()) {
				OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
				BufferedWriter bufferedWriter = new BufferedWriter(writer);
				bufferedWriter.write(pContent);
				// bufferedWriter.flush();
				bufferedWriter.close();
			} else {
				System.out.println("目标文件是文件夹");
			}
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("写入文件内容出错");
			e.printStackTrace();
		}
	}

	/**
	 * 根据路径删除指定的目录或文件，无论存在与否
	 * 
	 * @param sPath
	 *            要删除的目录或文件
	 * @return 删除成功返回 true，否则返回 false。
	 */
	public static boolean deleteFolder(String sPath) {
		boolean flag = false;
		File file = new File(sPath);
		// 判断目录或文件是否存在
		if (!file.exists()) { // 不存在返回 false
			return flag;
		} else {
			// 判断是否为文件
			if (file.isFile()) { // 为文件时调用删除文件方法
				return deleteFile(sPath);
			} else { // 为目录时调用删除目录方法
				return deleteDirectory(sPath);
			}
		}
	}

	/**
	 * 删除单个文件
	 * 
	 * @param sPath
	 *            被删除文件的文件名
	 * @return 单个文件删除成功返回true，否则返回false
	 */
	private static boolean deleteFile(String sPath) {
		boolean flag = false;
		File file = new File(sPath);
		// 路径为文件且不为空则进行删除
		if (file.isFile() && file.exists()) {
			flag = file.delete();
			return flag;
		}
		return flag;
	}

	/**
	 * 删除目录（文件夹）以及目录下的文件
	 * 
	 * @param sPath
	 *            被删除目录的文件路径
	 * @return 目录删除成功返回true，否则返回false
	 */
	private static boolean deleteDirectory(String sPath) {
		// 如果sPath不以文件分隔符结尾，自动添加文件分隔符
		if (!sPath.endsWith(File.separator)) {
			sPath = sPath + File.separator;
		}
		File dirFile = new File(sPath);
		// 如果dir对应的文件不存在，或者不是一个目录，则退出
		if (!dirFile.exists() || !dirFile.isDirectory()) {
			return false;
		}
		boolean flag = true;
		// 删除文件夹下的所有文件(包括子目录)
		File[] files = dirFile.listFiles();
		for (int i = 0; i < files.length; i++) {
			// 删除子文件
			if (files[i].isFile()) {
				flag = deleteFile(files[i].getAbsolutePath());
				if (!flag)
					break;
			} // 删除子目录
			else {
				flag = deleteDirectory(files[i].getAbsolutePath());
				if (!flag)
					break;
			}
		}
		if (!flag)
			return false;
		// 删除当前目录
		if (dirFile.delete()) {
			return true;
		} else {
			return false;
		}
	}

}
